#pragma once

#include <iostream>
#include<cstring>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cassert>
#include "Log.hpp"

using namespace std; //不推荐

#define PATH_NAME "/home/ztb"
#define PROJ_ID 0x66
#define SHM_SIZE 4096 //共享内存的大小，最好是页(PAGE: 4096)的整数倍 

#define FIFE_NAME "./fifo.ipc"


class Init{
    public:
    Init()
    {
        int n=mkfifo(FIFE_NAME,0666);
        assert(n==0);
        Log("create fifo success\n",Notice);
       

    }
    ~Init()
    {
        unlink(FIFE_NAME);
        Log("delete fifo success\n",Notice);
    }
};
//定义Init类，在构造函数里面进行创建命名管道文件
//             在析构函数里面删除匿名管道文件
#define READ O_RDONLY
#define WRITE O_WRONLY
int OPEN_FIFO(string pathname,int flags)//打开文件
{
    int fd=open(pathname.c_str(),flags);
    assert(fd>=0);
    return fd;

}
//要实现同步控制，在写数据之后才能进行读数据
//在读共享内存中的数据之前，先调用wait（）函数，只有写了数据后，才读数据
void wait(int fd)
{
    cout<<"等待中....."<<endl;
  uint32_t temp=0;
  ssize_t s=read(fd,&temp,sizeof(uint32_t));
  //命名管道中的数据是什么并不关心，主要是命名管道中没有数据便会阻塞在这里
  assert(s==sizeof(uint32_t));
}
 //在往共享内存中写数据之后，调用signal函数，往命名管道中写数据，这样另一方才能读数据，解除阻塞
void signal(int fd)
{
    uint32_t temp=1;
   
   ssize_t s= write(fd,&temp,sizeof(uint32_t));
    assert(s==sizeof(uint32_t));
    cout<<"唤醒Server进程"<<endl;

}
 void CLOSE_FIFO(int fd)//关闭文件
 {
    close(fd);
 }